---
title: 软件架构风格
description: 常见的软件架构风格及其特点
date: 2025-04-28
sidebar_position: 2
---


## 概念与定义

- <RedSpan>软件体系结构风格</RedSpan>是<RedSpan>描述某一特定应用领域中系统组织方式的惯用模式</RedSpan>。
- 架构风格定义了一个系统家族，即一个<RedSpan>架构定义</RedSpan>、一个<RedSpan>词汇表</RedSpan>和一组<RedSpan>约束</RedSpan>。词汇表中包含一些构件和连接件类型，而约束指出系统是如何将这些构件和连接件组合起来的。

## 作用与意义

- 架构风格<RedSpan>反映了领域中各系统所共有的结构和语义特性</RedSpan>，并指导<RedSpan>如何将各模块和子系统有效地组织成一个完整的系统</RedSpan>。
- 对软件架构风格的研究和实践促进了设计的<RedSpan>重用</RedSpan>，一些经过实践验证的解决方案也可以可靠地用于解决新的问题。
- 架构设计的<RedSpan>一个核心问题是能否达到架构级的软件复用</RedSpan>。

## 规则与规范

- 架构风格定义了<RedSpan>用于描述系统的术语表和一组指导构建系统的规则</RedSpan>。

## 常见架构风格类型

### 数据流风格
面向数据流，按照一定的顺序从前向后执行程序。代表风格有批处理序列、管道-过滤器。


#### 批处理序列
- 构件为一系列固定顺序的计算单元，<RedSpan>构件之间只通过数据传递交互</RedSpan>。
- 每个处理步骤是一个独立的程序，<RedSpan>每一步必须在其前一步结束后才能开始</RedSpan>。
- 数据必须是完整的，以整体方式传递。
#### 管道-过滤器
- 每个构件都有一组输入和输出，<RedSpan>前一个构件的输出作为后一个构件的输入</RedSpan>。
- 构件读取输入的数据流，经过内部处理，产生输出数据流。
- 过滤器就是构件，连接件就是管道。


一般用在流媒体中，边看边播。


### 调用/返回风格
- 构件之间存在互相调用的关系，一般是显式调用。
- 代表风格：<RedSpan>主程序/子程序、面向对象、层次结构</RedSpan>

调用/返回风格强调<RedSpan>构件之间通过调用关系进行交互</RedSpan>，常见于主程序/子程序、面向对象、层次结构等系统。

#### 主程序/子程序
- 单线程控制，把问题划分为若干处理步骤，构件即为主程序和子程序。
- 子程序通常可合成为模块，<RedSpan>过程调用作为交互机制</RedSpan>，充当连接件的角色。

#### 面向对象
- 构件是对象，对象是抽象数据类型的实例。
- <RedSpan>连接件即对象间交互的方式</RedSpan>，对象通过函数和过程的调用来交互。

#### 层次结构
- 构件组成一个层次结构，<RedSpan>连接件通过协议定义层间如何交互</RedSpan>。
- 每层为上一层提供服务，只能见到与自己邻接的层。
- 修改某一层，最多影响其相邻的两层（通常只影响上层）。

##### 层次结构优点
1. 支持基于可增加抽象层的设计，便于复杂问题分解和增量步骤实现。
2. 不同层次处于不同抽象级别，越靠近底层抽象级别越高。
3. 每层只需与相邻层提供相同接口，允许每层用不同方法实现，便于软件复用。

##### 层次结构缺点
1. 并不是每个系统都能容易划分为分层模式。
2. 很难找到一个合适、正确的分层方法。

---

> **记忆要点**：
> - 主程序/子程序=过程调用、分模块
> - 面向对象=对象实例、函数/过程调用
> - 层次结构=分层、协议、只影响相邻层、便于复用

### 独立构件风格

独立构件风格强调<RedSpan>构件之间相互独立，不存在显式调用关系</RedSpan>。构件通过事件触发和异步通信的方式进行交互。代表风格包括<RedSpan>进程通信和事件驱动系统</RedSpan>。


#### 进程通信
- 构件是独立的进程，<RedSpan>连接件是消息传递</RedSpan>。
- 构件通常是命名过程，消息传递方式可以是点对点、异步或同步方式，以及远程过程（方法）调用等。

#### 事件驱动系统（隐式调用）
- 构件不直接调用一个过程，而是<RedSpan>触发或广播一个或多个事件</RedSpan>。
- 构件中的过程在一个或多个事件中注册，当某个事件被触发时，<RedSpan>系统自动调用在该事件中注册的所有过程</RedSpan>。
- 一个事件的触发可导致另一个模块中的过程调用，这种风格的构件是匿名过程，连接件往往是通过过程之间的隐式调用来实现的。

##### 优缺点
- 主要优点：<RedSpan>为软件复用提供了强大支持，为构件的维护和演化带来方便</RedSpan>。
- 缺点：<RedSpan>构件放弃了对系统计算的控制</RedSpan>。

---

> **记忆要点**：
> - 进程通信=独立进程、消息传递、点对点/异步/同步/远程调用
> - 事件驱动=触发事件、隐式调用、自动注册、匿名过程
> - 优点：强复用、易维护
> - 缺点：失控

### 虚拟机风格
虚拟机风格通过自定义一套规则供使用者使用，开发者可以基于这些规则来开发构件。这种风格的一个重要特点是能够实现跨平台适配。其代表性的架构风格包括<RedSpan>解释器和基于规则的系统</RedSpan>。

#### 解释器
- 主要组成部分：
  - <RedSpan>解释引擎</RedSpan>：完成解释工作的核心组件
  - <RedSpan>代码存储器</RedSpan>：存储待解释的代码
  - <RedSpan>状态数据结构</RedSpan>：记录解释引擎当前工作状态
  - <RedSpan>执行进度结构</RedSpan>：记录源代码的解释执行进度

##### 优点
- 可以仿真硬件执行过程和关键应用
- 实现跨平台运行
- 便于调试和修改

##### 缺点
- <RedSpan>执行效率较低</RedSpan>，相比直接编译执行
- 需要额外的解释开销

#### 基于规则的系统
基于规则的系统主要包含以下组成部分:

- <RedSpan>规则集</RedSpan>：存储系统所有规则的集合
- <RedSpan>规则解释器</RedSpan>：负责解释和执行规则的引擎
- <RedSpan>规则/数据选择器</RedSpan>：选择当前要执行的规则和数据
- <RedSpan>工作内存</RedSpan>：存储系统运行时的数据

这种架构风格主要应用于<RedSpan>人工智能领域和决策支持系统(DSS)</RedSpan>。


---

> **记忆要点**：
> - 解释器=解释引擎+代码存储+状态数据+执行进度
> - 优点：跨平台、易调试、可仿真
> - 缺点：效率低、额外开销
> - 规则系统=规则集+解释器+选择器+工作内存




### 仓库(数据共享)风格
以数据为中心，所有的操作都围绕统一的数据中心进行。
仓库风格主要包含以下几种类型:

#### 数据库系统
构件主要有两大类：
  - 一类是<RedSpan>中央共享数据源</RedSpan>,保存当前系统的数据状态
  - 另一类是<RedSpan>多个独立处理单元，处理单元对数据元素进行操作</RedSpan>。

#### 黑板系统
- 包括<RedSpan>知识源、黑板和控制</RedSpan>三部分
- 知识源包括若干<RedSpan>独立计算的不同单元</RedSpan>,提供解决问题的知识,知识源响应黑板的变化,也只修改黑板
- 黑板是一个全局数据库,包含问题域解空间的全部状态，是知识源相互作用的唯一媒介
- 知识源响应是通过黑板状态的变化来控制的。
- 黑板系统通常应用在<RedSpan>对于解决问题没有确定性算法的软件中</RedSpan>（信号处理、问题规划和编译器优化等）。

#### 超文本系统
- 软件以<RedSpan>网状链接方式组织链接</RedSpan>
- 用户可以在<RedSpan>构件之间进行按照人类的联想思维方式任意跳转到相关构件。</RedSpan>
- 是一种非线性的网状信息组织方法，以文本节点为基本单位,链接为节点之间的联想式关系的<RedSpan>网状风格</RedSpan>
- 通常应用在互联网领域

#### 现代编译器
- 现代编译器的集成开发环境一般采用数据仓库（即以数据中心的架构风格）架构风格进行开发，其中心数据就是程序的语法树。
- 架构风格进行开发,其中心数据就是程序的语法树


---

### 闭环控制风格
当软件被用来操作一个物理系统时，<RedSpan>软件和硬件之间可以粗略的表示为一个反馈循环</RedSpan>，
这个反馈循环通过接受一定的输入。确定一系列的输出，最终使环境达到一个新的状态，适合于嵌入式系统（空调，监控闭环中温度状态，决定输出冷气还是热气，直到达到设定的速度；还有就是自动巡航系统），涉及连续的动作与状态。


![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/20250430000305.png)

### C2体系风格

通过连接件绑定在一起的按照一组规则运作的并行构件网络。系统组织规则如下：

- 系统中的 <RedSpan>构件和连接件都有一个顶部和一个底部</RedSpan>；
- <RedSpan>构件的顶部应连接到某连接件的底部，构件的底部则应连接到某连接件的顶部</RedSpan>，而 <RedSpan>构件与构件之间的直接连接是不允许的</RedSpan>；
- 一个连接件可以和任意数目的其它构件和连接件连接
- 当两个连接件进行直接连接时，必须由其中一个的底部到另一个的顶部。
![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/20250430003029.png)

## 层次架构风格
### 两层CS架构
<RedSpan>客户端和服务器端都有处理功能，现在已经不常用</RedSpan>，原因有：
1. 开发成本较高、客户端程序设计复杂、信息内容和形式单一、用户界面风格不一、软件移植困难、软件维护和升级困难、新技术不能轻易应用、安全性问题、服务器端压力大难以复用。

![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/20250430233724.png)

### 三层CS架构
三层 C/S 架构，将 <RedSpan>处理功能独立出来</RedSpan>，表示层和数据层都变得简单。<RedSpan>表示层在客户机上，功能层在应用服务器上，数据层在数据库服务器上
。</RedSpan>即将两层 C/S 架构中的数据从服务器中独立出来了。其优点有下面四点：
- <RedSpan>各层在逻辑上保持相对独立</RedSpan>，整个系统的逻辑结构更为清晰，能提高系统和软件的可维护性和可扩展性。
- 允许 <RedSpan>灵活有效的选用相应的平台和硬件系统</RedSpan>，具有良好的可升级性和开放性。
- 各层可以 <RedSpan>并行开发</RedSpan>，各层也可以选择各自最适合的开发语言；
- 功能层有效的隔离表示层和数据层，为严格的安全管理奠定了坚实的基础，<RedSpan>整个系统的管理层次也更加合理和可控制</RedSpan>。
- 三层 C/S 架构设计的 <RedSpan>关键在于各层之间的通信频率</RedSpan>，要慎重考虑三层间的通信方法、通信频度和数据量，否则即使分配给各层的硬件能力很强，性能也不高。


![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/20250430234519.png)

### 三层B/S架构
是三层 C/S 的变种，将 <RedSpan>客户端变为客户端上的浏览器</RedSpan>，将 <RedSpan>应用服务器变为网络上的 WEB 服务器，</RedSpan>又称为 0 客户端架构，虽然不用开发客户端，但有很多缺点：

- B/S 架构缺乏对动态页面的支持能力（早期），没有集成有效的数据库处理功能；
- 安全性难以控制
- 在数据查询等响应速度上，要远远低于 C/S 架构。
- 数据提交一般以页面为单位，数据的动态交互性不强，不利于 OLTP 应用
### 混合架构风格
- 内外有别模型：企业内部使用 C/S，外部人员访问使用使用 B/S
- 查改有别模型：采用 B/S查询，采用 C/S 修改。
- 混合架构实现困难，且成本高

### 富互联网应用 RIA

弥补三层 B/S 架构存在的问题，<RedSpan>RIA是一种用户接口</RedSpan>， 比用 HTML 实现的接口更加健壮，且有可视化内容，本质还是网站模式，其优点如下：

- RIA <RedSpan>结合了 C/S 架构反应速度快，交互性强的优点和 B/S 架构传播范围广及容易传播的特性：</RedSpan>
- <RedSpan>RIA 简化并改进了 B/S 架构的用户交互；</RedSpan>
- <RedSpan>数据能够被缓存在客户端</RedSpan>，，从而可以实现一个比基于 HTML 的响应速度更快且数据往返与服务器次数更少的用户界面。

- <RedSpan>本质还是 0 客户端</RedSpan>，借助于 <RedSpan>高速网速实现必要插件在本地快速缓存</RedSpan>，增强页面对动态页面的支持能力，典型的如小程序。
### <RedSpan>MVC 架构</RedSpan>
- 控制器（Controller）：是应用程序中<RedSpan>处理用户交互的部分</RedSpan>。通常由控制器负责从视图读取数据，控制用户输入，并向模型发送数据。
- 模型（Model）：是应用程序中用于<RedSpan>处理应用程序数据逻辑的部分</RedSpan>。通常模型对象负责在数据库中存取数据。模型表示业务数据和业务逻辑。
- 视图（View）：是应用程序中<RedSpan>处理数据显示的部分</RedSpan>。通常视图是依据模型数据创建的。是用户看到并与之交互的界面。视图向用户展示相关的数据，并能接收用户的输入数据，但是它并不进行任何实际的业务处理。


![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/20250501014450.png)

### <RedSpan>MVP</RedSpan>
MVP 是把 MVC 中的<RedSpan>Controller换成了 Presenter（呈现），目的就是完全切断 View 跟 Model 之间的联系</RedSpan>，由Presenter 充当桥梁，做到了View-Model 之间通信的完全隔离。

MVP 特点:
1. M、V、P 之间双向通信。
2. View 与 Model 不通信，都通过 Presenter 传递。Presenter 完全把 Model 和 View 进行了分离，主要的程序逻辑在 Presenter 里实现。
3. View 非常薄，不部署任何业务逻辑，被称为 “被动视图（Passive View）”，即没有任何主动性，而 Presenter 非常厚，所有逻辑都部署在哪里。
4. Presenter 与具体的 View 是没有直接关联的，而是通过定义好的接口进行交互，从而使得在变更 View 的时候可以保持 Presenter 的不变，这样就可以重用。


![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/images/20250504140257445.png)


### MVVM
MVVM 和 MVC 模式有点类似，主要目的是分离视图（View）和模型（Model），有几大优点：
1. 低耦合，视图（View）可以独立于 Model 变化和修改，一个 ViewModel 可以绑定到不同的 View 上，当 View 变化时，Model 可以保持不变，当 Model 变化时 View 也可以不变。
2. 可重用性：可以把一些视图逻辑放在一个 ViewModel 里面，让很多 View 重用这段视图逻辑。
3. 独立开发：开发人员可以专注于业务逻辑和数据的开发（ViewModel），设计人员可以专注于页面设计。
4. 可测试，界面向来是比较难以测试的，而现在测试可以针对 ViewModel 来写。



![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/images/20250504140942109.png)
## 面向服务的架构风格SOA
SOA是一种 <RedSpan>粗粒度、松耦合的服务架构</RedSpan>，服务之间通过简单、精确定义接口进行通信，不涉及底层编程接口和通信模型。

在 SOA 中，<RedSpan>服务是一种为了满足某项业务需求的操作、规则等的逻辑组合</RedSpan>，它包含一系列有序活动的交互，为实现用户目标提供支持。

SOA 并不仅仅是一种开发方法，还具有管理上的有点，<RedSpan>管理员可以直接管理开发人员所构建的相同服务</RedSpan>。多个服务 <RedSpan>通过企业总线提出服务请求</RedSpan>，由应用管理来进行处理，如下：


![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/images/20250504141713236.png)

实施 SOA的关键目标是 <RedSpan>实现企业资产重用的最大化，</RedSpan>在实施 SOA 过程中要牢记以下特征：

- 可从企业外部访问、随时可用（服务请求能被及时响应） 、粗粒度接口（粗粒度提供一项特定的业务功能，而细粒度服务代表了技术构件方法）、服务分级、松散耦合（服务提供者和服务使用者分离）、可重用的服务及服务接口设计管理、标准化的接口（WSDL、SOAP、XML 是核心）、支持各种消息模式、精确定义的服务接口。

- 从基于对象到基于构件再到基于服务，<RedSpan>架构越来越松散耦合，粒度越来越粗，接口越来越标准</RedSpan>。

基于服务的构建与传统构建的区别有四点：
- 服务构件 <RedSpan>粗粒度</RedSpan>，传统构建细粒度居多；
- 服务接口是标准的，主要是 WSDL 接口，而传统常以具体 API 形式出现；
- 服务构件的 <RedSpan>实现与语言是无关的</RedSpan>，而传统构建常绑定某种特定的语言；
- 服务构件可以 <RedSpan>通过构件容器提供 Qos 的服务</RedSpan>，而传统构件完全由程序代码直接控制


SOA 中应用的关键技术如下表：

| 功能         | 协议                           |
|--------------|--------------------------------|
| 发现服务     | UDDI、DISCO                    |
| 描述服务     | WSDL、XML Schema               |
| 消息格式层   | SOAP、REST                     |
| 编码格式层   | XML（DOM，SAX）                |
| 传输协议层   | HTTP、TCP/IP、SMTP等           |

- UDDI: 是一套基于 WEB 的、分布式的、为 WebService 提供的、信息注册中心的实现标准规范，同时也包含一组企业能将自身提供的 WebService 注册，以使别的企业能够发现的访问协议的实现标准，<RedSpan>用于 WEB 服务注册统一描述、发现及集成</RedSpan>
- WSDL（WebService 描述语言）：将 Web服务描述定义为一组服务访问点，客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问（类似远程调用），用于描述服务。
- SOAP（简单对象访问协议）： 是<RedSpan>用于交换XML编码信息的轻量级协议，用于传递信息。</RedSpan>
- XML（可扩展标记语言）：是 WebService 平台中 <RedSpan>表示数据的基本格式，用于数据交换</RedSpan>


### SOA 实现方式
#### Web Service
服务提供者、服务注册中心（中介，提供交易平台，可有可无）

服务请求者：服务提供者将服务描述发布到服务注册中心，供服务请求者查找，查找到后，服务请求者将绑定查找结果。


![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/images/20250504160750434.png)

服务注册表
- 服务注册：应用开发者（服务提供者）在注册表中公布服务的功能。
- 服务位置：服务使用者（服务应用开发者），帮助他们查询注册服务，寻找符合自身要求的服务。
- 服务绑定：服务使用者利用检索到的服务接口来编写代码，所编写的代码与注册的服务绑定，调用注册的服务，以及与它们的实现互动 。


#### 企业服务总线 ESB
简单来说是 <RedSpan>一根管道，用来连接各个服务节点</RedSpan>。ESB的存在是为了 <RedSpan>集成基于不同协议的不同服务，ESB 做了消息的转化、解释以及路由的工作，以此来让不同的服务互联互通。</RedSpan>

包括：客户端（服务请求者）、基础架构服务（中间件）、核心集成服务（提供服务）

特点：
1. SOA 的一种实现方式，ESB 在面向服务的架构中起到总线作用，将各种服务进行连接与整合；
2. 描述 <RedSpan>服务的元数据和服务注册管理</RedSpan>
3. 在服务请求者和服务提供者之间 <RedSpan>传递数据、以及对这些数据进行转换的能力</RedSpan>，并支持由事件中总结出来的一些模式如同步模式、异步模式等；
4. <RedSpan>发现、路由、匹配和选择的能力</RedSpan>，以支持服务之间的动态交互，解耦服务请求者和服务提供者。高级一些的能力，包括对安全的支持，服务质量保证，可管理性和负载均衡等。

![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/images/20250504162936381.png)
## 总结

<table>
  <thead>
    <tr>
      <th>架构风格名</th>
      <th>常考关键字及实例</th>
      <th>简介</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="2">数据流-批处理：<br/>数据流-管道-过滤器</td>
      <td><span style={{ color: 'red' }}>传统编译器</span>。每个阶段产生的结果作为下一个阶段的输入，反复迭代至整体。</td>
      <td>一个接一个，<span style={{ color: 'red' }}>以整体为单位</span>。</td>
    </tr>
    <tr>
      <td>一个接一个，前一个输出是后一个输入。</td>
      <td></td>
    </tr>
    <tr>
      <td>调用/返回-主程序/子程序</td>
      <td><span style={{ color: 'red' }}>显示调用</span>，主程序直接调用子程序。</td>
      <td>显示调用，主程序直接调用子程序。</td>
    </tr>
    <tr>
      <td>调用/返回-面向对象</td>
      <td>对象是构件，通过对象调用封装的方法和属性。</td>
      <td>对象是构件，通过对象调用封装的方法和属性。</td>
    </tr>
    <tr>
      <td>调用/返回-层次结构</td>
      <td>分层，最多影响其上下两层，有明确关系。</td>
      <td>分层，最多影响其上下两层，有明确关系。</td>
    </tr>
    <tr>
      <td>独立构件-进程通信</td>
      <td>进程间独立的消息传递，同步异步。</td>
      <td>进程间独立的消息传递，同步异步。</td>
    </tr>
    <tr>
      <td>独立构件-事件驱动（隐式调用）</td>
      <td>事件触发，<span style={{ color: 'red' }}>如程序语言的语法高亮、语法错误提示</span></td>
      <td>不直接调用，通过<span style={{ color: 'red' }}>事件驱动</span>。</td>
    </tr>
    <tr>
      <td>虚拟机-解释器</td>
      <td><span style={{ color: 'red' }}>自定义流程</span>，按流程执行，规则随时改变，<span style={{ color: 'red' }}>灵活定义</span>，业务灵活组合。</td>
      <td>解释自定义的规则，解释引擎，存储区、数据结构。</td>
    </tr>
    <tr>
      <td>虚拟机-规则系统</td>
      <td>规则集、规则解释器。选择规则和工作内存，用于 <span style={{ color: 'red' }}>DSS 和人工智能、专家系统</span>。</td>
      <td>规则集、规则解释器。选择规则和工作内存，用于 DSS 和人工智能、专家系统。</td>
    </tr>
    <tr>
      <td rowspan="3">仓库-数据库：<br/>仓库-超文本：<br/>仓库-黑板：</td>
      <td>现代编译器的<span style={{ color: 'red' }}>集成开发环境</span>，IDE，以数据为中心。</td>
      <td>中央共享数据源，独立处理单元。</td>
    </tr>
    <tr>
      <td>网状链接，多用于互联网。</td>
      <td>网状链接，多用于互联网。</td>
    </tr>
    <tr>
      <td>知识识别、知识推理等问题复杂、解决问题很大、解决过程不确定的这一类软件系统。黑板、知识源、控制。</td>
      <td>知识识别、知识推理等问题复杂、解决问题很大、解决过程不确定的这一类软件系统。黑板、知识源、控制。</td>
    </tr>
    <tr>
      <td>闭环-过程控制</td>
      <td>汽车巡航定速、空调温度调节，设定参数，循环调整。</td>
      <td>发出控制命令并接受反馈，循环往复达到平衡。</td>
    </tr>
    <tr>
      <td>C2 风格</td>
      <td>构件和连接件，顶部和底部。</td>
      <td>通过连接件绑定在一起按规则一组规则运作的并行构件网络。</td>
    </tr>
  </tbody>
</table>

